package com.bhudy.base;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @Author bhudy
 * @Description BaseService
 * @Date 2019-10-30 23:09:37
 */
public interface BaseService<T, PK extends Serializable> {

    int update(String sql, Object... args);

    /**
     * 插入单条数据，返回受影响行数
     */
    <C> int insert(C entity);

    /**
     * 批量插入数据，返回受影响行数
     */
    <C> int insert(List<C> entityList);

    /**
     * 修改数据，主键不能为空，返回受影响行数
     */
    <C> int update(C entity);

    <C> int update(List<C> entityList);

    <C> int update(C entity, QueryFilter queryFilter);

    int delete(PK... pks);

    <C> int delete(Class<C> clazz, PK... pks);

    int delete(QueryFilter queryFilter);

    <C> int delete(Class<C> clazz, QueryFilter queryFilter);

    /**
     * 根据sql语句查询数据，返回Map,带参数
     */
    List<Map<String, Object>> findMapList(String sql, Object... args);


    int findCount(String sql, Object... args);


    /**
     * 根据动态参数查询数据
     */
    List<T> findList(QueryFilter queryFilter);

    /**
     * 根据动态参数和实体类查询数据
     */
    <C> List<C> findList(Class<C> clazz, QueryFilter queryFilter);

    T find(QueryFilter queryFilter);

    <C> C find(Class<C> clazz, QueryFilter queryFilter);

    /**
     * 查询全部数据，没有查询到数据返回null
     */
    List<T> findAll();

    <C> List<C> findAll(Class<C> clazz);

    /**
     * 根据主键查询数据，没有查询到数据返回null
     */
    T get(PK pk);

    /**
     * 根据实体类和主键查询一条数据
     */
    <C> C get(Class<C> clazz, PK pk);

    /**
     * 查询count
     *
     * @param queryFilter
     * @return
     */
    int count(QueryFilter queryFilter);

    <C> int count(Class<C> clazz, QueryFilter queryFilter);

    <K, V> Map<K, V> getMapping(String k, String v);

    <K, V> Map<K, V> getMapping(String k, String v, QueryFilter queryFilter);

    <C, K, V> Map<K, V> getMapping(Class<C> tClass, String k, String v);

    <C, K, V> Map<K, V> getMapping(Class<C> tClass, String k, String v, QueryFilter queryFilter);

    String keyword(String name);

    String keywords(String... name);

}
